﻿// Allgemeine Funktionalität für Netzwerk-Programmierung
using System.Net;
// Funktionalitäten speziell für die Verbindungsverwaltung
using System.Net.Sockets;
// Funktionalitäten für die Prozess-Erstellung und -Verwaltung
using System.Threading;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Frontend;

namespace ConsoleApplication1
{
    public class Connector
    {


// ---------------------------------------------- Deklaration der Variablen ----------------------------------------------

        private String messageFromServer;
        private String messageToServer;

        private Puffer puffer;

        public Receiver rec = null;
        public Sender send = null;



// --------------------------------------------- Konstruktor Initialisierung ---------------------------------------------

        /*
         * Konstruktor des Connectors
         * 
         * @param
         */
        public Connector()
        {
           puffer = new Puffer(this);
           TcpClient client = new TcpClient();
           //client.Connect("127.0.0.1", 6000);
           client.Connect("85.214.103.114", 110);

            
           //Receiver und Sender Objekte
           rec = new Receiver(client, this);
           send = new Sender(client);

           //Thread für den Sender
           Thread sendThread = new Thread(new ThreadStart(send.SendMessageToServer));
           sendThread.Start();

           //Thread für den Receiver
           Thread receiveThread = new Thread(new ThreadStart(rec.GetMessageFromServer));
           receiveThread.Start();
        }

// ------------------------------------------------ öffentliche Methoden -------------------------------------------------

        public void writeListToPuffer(List<String> listedElements)
        {
            puffer.EnqueueMessage(listedElements);
        }


// ----------------------------------------------- Getter/Setter-Methoden -----------------------------------------------
        /*
        * Getter/Setter-Methode für die serverseitige Nachricht
        * @return gibt den String mit der Nachricht von den Server zurück
        */
        public String MessageFromServer
        {
            get
            {
                return messageFromServer;
            }
            set
            {
                this.messageFromServer = value;
            }
        }


        /*
        * Getter/Setter-Methode für die Nachricht welche an den Server gesendet wird
        * @return gibt den String mit der Nachricht für den Server zurück
        */
        public String MessageToServer
        {
            get
            {
                return messageToServer;
            }
            set
            {
                this.messageToServer = value;
                Console.WriteLine("im Connector: " + messageToServer);
                send.MessageToServer = messageToServer;
            }
        }


        /*
         * Getter/Setter-Methode für den Puffer
         * @return  gibt das Puffer-Objekt zurück
         */
        public Puffer Puffer
        {
            get
            {
                return puffer;
            }
            set
            {
                this.puffer = value;
            }
        }







    }
}
